package nettyteach.reconnheart;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

import java.net.InetSocketAddress;

/**
 * 服务器端启动类
 */
public class AppServerReconnHeart {
    private int port;
    public AppServerReconnHeart(int port){
        this.port=port;
    }
    public void run() throws  Exception{
        EventLoopGroup group=new NioEventLoopGroup();//netty的reactor线程池，初始化一个数组
        try{
            ServerBootstrap b=new ServerBootstrap();//用于启动NIO服务
            b.group(group)
                    .channel(NioServerSocketChannel.class)//通过工厂方法涉及模式实例化一个channel
                    .localAddress(new InetSocketAddress(port))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        //ChannelInitializer是一个特殊的处理类，他的目的是帮助使用者配置一个新的channel,用于许多自定义的处理类增加到了pipline上来
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                           socketChannel.pipeline().addLast(new HandlerServerReconnHeart());//配置chaildHandler来通知一个关于消息处理
                        }
                    });
            //绑定服务器，该实例将提供有关io操作的结果或状态的信息
            ChannelFuture channelFuture=b.bind().sync();
            System.out.println("在"+channelFuture.channel().localAddress()+"上开启监听");
            //阻塞操作，closeFuture()开启了一个channel的监听器（这期间channel在进行各项工作），直到链路断开
           channelFuture.channel().closeFuture().sync();
        }finally {
            group.shutdownGracefully().sync();//关闭所有EventLoopGroup并释放所有资源，包括所有创建的线程

        }
    }

    public static void main(String[] args) throws Exception {

        new AppServerReconnHeart(18080).run();
    }
}
